<!DOCTYPE HTML>
<html>
<head><meta name="generator" content="Hexo 3.9.0">
  <meta charset="utf-8">
  
  <title>Page 5 › 但行好事，莫问前程</title>
  <meta name="author" content="fengbo">
  
  <meta name="description" content="不想当架构师的程序员不是好厨师 ，不认为PHP是世界上最好的编程语言的Python开发者不是一个好的Javaer。">
  
  
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">

  
  <meta property="og:site_name" content="但行好事，莫问前程">

  
    <meta property="og:image" content="undefined">
  

  <link href="/favicon.png" rel="icon">
  <link rel="alternate" href="/atom.xml" title="但行好事，莫问前程" type="application/atom+xml">
  <link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">
  <!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
  

</head>
</html>

<body>
  <header id="header"><div class="meta inner">
  <h1><a href="/">但行好事，莫问前程</a></h1>
  <h2><a href="/">CV工程师，了解面向Google编程的基本原理，有三年使用Google经验，在通往程序员的道路上艰难的爬行着。</a></h2>
  <nav id="main-nav">
    <ul>
      
      <li><a href="/">Home</a></li>
      
      <li><a href="/archives">Archives</a></li>
      
      <li><a href="/atom.xml">RSS</a></li>
      
    </ul>
    <div class="clearfix"></div>
  </nav>
</div>
<div class="clearfix"></div>
</header>
  <div id="content" class="inner">
    <div id="main-col" class="alignleft"><div id="wrapper">
  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2019/07/14/Java设计模式之单例模式/">Java设计模式之单例模式</a></h1>
  

      
        <time datetime="2019-07-14T02:49:07.000Z">2019-07-14</time>
      
    </header>
    <div class="entry">
      
        <p>该模式保证了一个类只有一个对象实例。一般会将构造方法私有化，使其不能在类的外部通过new关键字实例化该类对象。<br>
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2019/07/14/Java设计模式之单例模式/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2019/05/01/Python实现屏幕截图/">Python实现屏幕截图</a></h1>
  

      
        <time datetime="2019-05-01T03:24:59.000Z">2019-05-01</time>
      
    </header>
    <div class="entry">
      
        <p>之前使用Python构建了一个图片转文字小工具，但是使用的是使用系统自带的截图工具然后监听目录变化来实现的。接下来我想直接使用Python来构建一个截图工具，这样就可以结合转换工具使用。<br>
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2019/05/01/Python实现屏幕截图/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2019/03/01/Python实现的图片转文字小工具/">Python实现的图片转文字小工具</a></h1>
  

      
        <time datetime="2019-03-01T07:27:16.000Z">2019-03-01</time>
      
    </header>
    <div class="entry">
      
        <p>阅读PDF书籍时如果该书是扫描版的那么记笔记就需要手打文字。个人感觉及其麻烦（主要还是懒）。所以想着实现一个简单的图片转文字小工具提升一下自己的阅读效率。<br>
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2019/03/01/Python实现的图片转文字小工具/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2019/01/26/其它之Nginx使用/">Nginx使用</a></h1>
  

      
        <time datetime="2019-01-26T06:07:10.000Z">2019-01-26</time>
      
    </header>
    <div class="entry">
      
        <h3 id="Nginx基本概念"><a href="#Nginx基本概念" class="headerlink" title="Nginx基本概念"></a>Nginx基本概念</h3><ul>
<li>Nginx是一款轻量级的Web服务器、反向代理服务器及电子邮件代理服务器。目前大多数公司使用Nginx作为反向代理服务器，反向代理是指接受外部网络请求后转发到内网中真正可以处理业务逻辑的服务器上，并将从服务器上得到的结果返回给用户。</li>
<li>正向代理和反向代理的区别是正向代理的用户的真实访问地址不是代理服务器，却通过代理服务器进行了转发；反向代理的用户的访问地址就是代理服务器，而真实处理请求的服务器却不是代理服务器。</li>
<li>代理连接的是两个或多个使用相同协议的应用程序，而网关连接的则是两个或多个使用不同协议的端点。网关扮演的是协议转换器的角色，即使客户端和服务器使用的是不同的协议，客户端也可以通过它完成与服务器之间的事务处理。
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2019/01/26/其它之Nginx使用/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2019/01/18/Dubbo-RPC实现细节/">Dubbo之RPC实现细节</a></h1>
  

      
        <time datetime="2019-01-18T12:43:36.000Z">2019-01-18</time>
      
    </header>
    <div class="entry">
      
        <p>Dubbo使用了Mine、Netty3和Netty4等框架实现了RPC调用，本文主要基于Netty分析Dubbo的RPC实现源码。这部分源码在dubbo-remoting-netty4模块中的NettyServer类中。<br>
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2019/01/18/Dubbo-RPC实现细节/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2019/01/13/Dubbo-SPI基础使用/">Dubbo之SPI基础使用</a></h1>
  

      
        <time datetime="2019-01-13T04:29:51.000Z">2019-01-13</time>
      
    </header>
    <div class="entry">
      
        <h3 id="SPI简介"><a href="#SPI简介" class="headerlink" title="SPI简介"></a>SPI简介</h3><p>SPI全称为Service Provider Interface，是一种服务发现机制。SPI的本质是将接口实现类的全限定名配置在文件中，并由服务加载器读取配置文件，加载实现类。这样可以在运行时，动态为接口替换实现类。正因此特性，我们可以很容易的通过SPI机制为我们的程序提供拓展功能。<br>
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2019/01/13/Dubbo-SPI基础使用/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2018/12/28/Dubbo-服务的注册方向与访问/">Dubbo之服务的注册发现与访问</a></h1>
  

      
        <time datetime="2018-12-28T11:49:14.000Z">2018-12-28</time>
      
    </header>
    <div class="entry">
      
        <h2 id="Dubbo基础"><a href="#Dubbo基础" class="headerlink" title="Dubbo基础"></a>Dubbo基础</h2><h3 id="RPC请求过程"><a href="#RPC请求过程" class="headerlink" title="RPC请求过程"></a>RPC请求过程</h3><p>客户端启动的时候会根据配置的信息（集成Spring的xsd扩展槽，生成一些自定义的XML标签）为需要远程的接口生成代理类，在代理类中会集成网络通讯的逻辑，即将请求的方法和参数序列化到服务器端，服务器执行后将执行结果序列化返回给客户端，所以在客户端看起来像是直接访问服务端的方法。</p>
<h3 id="服务治理和服务发现"><a href="#服务治理和服务发现" class="headerlink" title="服务治理和服务发现"></a>服务治理和服务发现</h3><p>服务治理指管理各个服务的服务。服务治理最核心的问题是服务发现和服务注册。Dubbo引入了一个注册中心的概念，服务的注册和发现主要依赖这个服务中心。具体过程为：</p>
<ol>
<li>服务提供者启动并将服务注册到注册中心注册自己提供的服务。</li>
<li>服务消费者启动，向注册中心订阅自己需要的服务。</li>
<li>注册中心返回服务提供者地址列表给消费者，如果有变更，注册中心将基于长连接推送变更数据给消费者。</li>
<li>服务消费者，从提供者地址列表中，基于软负载均衡算法（默认是基于权重的随机算法），选一台提供者进行调用，如果调用失败，在选另一台调用。</li>
<li>服务消费者和提供者，在内存中累计调用次数和调用时间，定时每分钟发送一次统计数据到监控中心。</li>
</ol>
<h3 id="Dubbo健壮性"><a href="#Dubbo健壮性" class="headerlink" title="Dubbo健壮性"></a>Dubbo健壮性</h3><ul>
<li>监控中心宕机不影响使用，只是丢失部分采样数据。</li>
<li>注册中心对等集群，任意一台宕机后，将自动切换到另一台。</li>
<li><b>注册中心全部宕机后，服务提供者和服务消费者仍能通过本地缓存通信。</b></li>
<li>服务提供者无状态，任意一台宕机后，不影响使用。</li>
<li>服务提供者全部宕机后，服务消费者应用将无法使用，并无限次重连等待服务提供者恢复。</li>
<li>在一定时间内服务提供者没有返回，则认为本次调用失败。失败后会再次调用，如果在配置的调用次数内都失败，则认为此次请求异常，抛出异常。<b>可能引发发送邮件重复或账户注册重复等问题。</b></li>
</ul>
<h3 id="Dubbo保证幂等性"><a href="#Dubbo保证幂等性" class="headerlink" title="Dubbo保证幂等性"></a>Dubbo保证幂等性</h3><p>用户对于同一操作发起的一次请求或者多次请求的结果是一致的，不会因为多次点击而产生了副作用。首先在业务逻辑中就应该注意保证接口的幂等性，而像转账这些无法保证的操作可以考虑使用分布式锁。例如使用redis的setNX（SET if Not eXists）若给定的key已经存在，则setNX不做任何操作。<br>支付操作流程：先查询订单状态如果订单未付款就使用setNX根据订单号设置一个key，当服务调用成功或回滚后才会删除key。然后构建一个本地事务修改订单状态和扣款。转账类似，在确认转账但未输入密码付款前可以生成一条有唯一编号且状态为未付款的交易记录。</p>
<h3 id="Dubbo配套设施"><a href="#Dubbo配套设施" class="headerlink" title="Dubbo配套设施"></a>Dubbo配套设施</h3><p>熔断、限流、降级、隔离，监控、服务测试、api网关、注册中心等。</p>
<ul>
<li>服务注册与发行：Zookeeper和Eureka（不维护）和Nacos。</li>
<li>负载均衡：自带管控台可以进行配置。</li>
<li>服务熔断：Sentinel和Hystrix（不在活跃开发）。</li>
<li>分布式配置：Nacos，即Nacos可以作为sentinel规则配置中心。</li>
</ul>
<h2 id="Dubbo调用"><a href="#Dubbo调用" class="headerlink" title="Dubbo调用"></a>Dubbo调用</h2><h3 id="Dubbo调用原理分析"><a href="#Dubbo调用原理分析" class="headerlink" title="Dubbo调用原理分析"></a>Dubbo调用原理分析</h3><ul>
<li>基于Spring的XML解析扩展机制自定义Dubbo的基于XML的配置格式。</li>
<li>dubbo-config项目的dubbo-config-spring子项目负责解析Dubbo的XML配置文件（主要是解析出Dubbo的注册中心地址、使用的传输协议、服务器端的端口号等）。</li>
<li>解析出配置后服务器端启动，并将自己所能提供的服务注册到注册中心，然后通过dubbo-remoting项目的dubbo-remoting-netty4子项目（dubbo协议）开启服务。</li>
<li>客户端同样通过Spring的XML解析机制解析出配置的各种参数，在通过注册中心或直接配置拿到服务器端的地址，然后通过dubbo-remoting项目的dubbo-remoting-netty4子项目（dubbo协议）连接到服务器端。
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2018/12/28/Dubbo-服务的注册方向与访问/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>



  <article class="post">
  <div class="post-content">
    <header>
      
  
    <h1 class="title"><a href="/2018/12/01/基础之计算机网络/">计算机网络</a></h1>
  

      
        <time datetime="2018-12-01T07:32:20.000Z">2018-12-01</time>
      
    </header>
    <div class="entry">
      
        <p>TCP/IP提供一种面向连接的、可靠的字节流服务。面向连接意味着两个使用TCP的应用（通常是一个客户和一个服务器）在彼此交换数据之前必须先建立一个TCP连接。在一个TCP连接中，仅有两方进行彼此通信。广播和多播不能用于TCP。<br>
      
    </div>
      
        
        <footer>
          <div class="alignleft">
            <a href="/2018/12/01/基础之计算机网络/#more" class="more-link">Read More ›</a>
          </div>
        
        
      
      <div class="clearfix"></div>
      </footer>
  </div>
</article>




<nav id="pagination">
  
    <a href="/page/4/" class="alignleft prev">上一页</a>
  
  
    <a href="/page/6/" class="alignright next">下一页</a>
  
  <div class="clearfix"></div>
</nav></div></div>
    <aside id="sidebar" class="alignright">
  
<div class="widget tagcloud">
  <h3 class="title">文章分类</h3>
  <div class="entry">
    <a href="/tags/JavaWeb/" style="font-size: 17.14px;">JavaWeb</a> <a href="/tags/Java基础/" style="font-size: 15.71px;">Java基础</a> <a href="/tags/Java高级特性/" style="font-size: 15.71px;">Java高级特性</a> <a href="/tags/Python/" style="font-size: 10px;">Python</a> <a href="/tags/Spring基础/" style="font-size: 14.29px;">Spring基础</a> <a href="/tags/WebRTC/" style="font-size: 10px;">WebRTC</a> <a href="/tags/其它/" style="font-size: 20px;">其它</a> <a href="/tags/分布式/" style="font-size: 11.43px;">分布式</a> <a href="/tags/硬件/" style="font-size: 12.86px;">硬件</a> <a href="/tags/计算机基础/" style="font-size: 18.57px;">计算机基础</a> <a href="/tags/设计模式/" style="font-size: 17.14px;">设计模式</a>
  </div>
</div>



    <div class="widget tagcloud">
    <h3 class="title">电子书</h3>
    <ul class="entry">
      <li class='link'><a href='http://www.duokan.com/' target="_blank">多看阅读</a>&nbsp;&nbsp;<a href='https://read.douban.com/' target="_blank">豆瓣阅读</a>&nbsp;&nbsp;<a href='http://e.dangdang.com/' target="_blank">当当阅读</a></li>
      <li class='link'><a href='http://www.ituring.com.cn/' target="_blank">图灵社区</a>&nbsp;&nbsp;<a href='https://www.epubit.com/' target="_blank">异步社区</a>&nbsp;&nbsp;<a href='https://www.geekbang.org/' target="_blank">极客空间</a></li>
    </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">友情链接</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://www.cnblogs.com/jietang/' target="_blank">唐洁的博客</a></li>
        
          <li class='link'><a href='http://rednaxelafx.iteye.com/' target="_blank">R大的博客</a></li>
        
          <li class='link'><a href='http://www.hollischuang.com/' target="_blank">阿里大神的博客</a></li>
        
          <li class='link'><a href='http://blog.csdn.net/IT_faquir/' target="_blank">IT_faquir的专栏</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">思维导图</h3>
      <ul class="entry">
        
          <li class='link'><a href='https://fengbo4213.github.io/img/开源协议.png' target="_blank">开源协议简介</a></li>
        
          <li class='link'><a href='https://www.processon.com/diagraming/5b0cf757e4b009aef58d4b9d' target="_blank">我的知识体系</a></li>
        
          <li class='link'><a href='https://www.processon.com/view/link/5a2a00e5e4b015e677290b4f' target="_blank">简单的网站架构</a></li>
        
      </ul>
  </div>


  
  <div class="widget tag">
    <h3 class="title">在线手册</h3>
      <ul class="entry">
        
          <li class='link'><a href='http://v3.bootcss.com/' target="_blank">BootStrap官方手册</a></li>
        
          <li class='link'><a href='http://www.iconfont.cn/http://element.eleme.io/#/zh-CN/' target="_blank">阿里巴巴矢量图标库</a></li>
        
      </ul>
  </div>


  
<div class="widget tag">
  <h3 class="title">最新文章</h3>
  <ul class="entry">
    
      <li>
        <a href="/2123/08/30/基础之MySQL原理/">MySQL原理</a>
      </li>
    
      <li>
        <a href="/2024/01/01/其它之ClickHouse索引/">ClickHouse索引</a>
      </li>
    
      <li>
        <a href="/2023/12/17/其它之MySQL线程池/">MySQL线程池</a>
      </li>
    
      <li>
        <a href="/2023/12/16/其它之InnoDB性能优化基础/">InnoDB性能优化基础</a>
      </li>
    
      <li>
        <a href="/2023/12/03/其它之Java8之后的版本新特性/">Java8之后的版本新特性</a>
      </li>
    
  </ul>
</div>

</aside>
    <div class="clearfix"></div>
  </div>
  <footer id="footer" class="inner"><div class="alignleft">
  
  &copy; 2024 fengbo
  
</div>
<div class="clearfix"></div></footer>
  <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>



</body>
</html>

